package tablut;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.Timer;


public class JoueurTropKool implements IJoueur, ActionListener {
	static int couleurJ;
	Plateau plateau;
	Timer timerIA;
	boolean peutContinuer;
	
	
	public JoueurTropKool() {
		couleurJ = 0;
		plateau = new Plateau();
		timerIA = new Timer(10000, this);	// L'IA calculera pendant 10 secondes
		timerIA.setRepeats(false);
	}
	
	public String choixMouvement() {
		Coup coup = executeIA();
		String msg = "" + coup;
		System.out.println("Voici mon mouvement : " + msg);
		plateau.jouerCoupSansHisto(coup);
		return msg;
	}
	
	public void declareLeVainqueur(int colour) {
		if(colour == couleurJ) {
			System.out.println("Ouééé, on né trp dé ouuuuuf \\o/ .o. \\o/ _o\\ \\o| |o/ /o_ YEAAAAH !");
		}
		else if(colour == (couleurJ%2 + 1)) {
			System.out.println("Haaaaaan, comen on né trp dé CACAAAAAAAAAAA :'( :'( :'( :'(  >>--(x_x)-->");
		}
		else {
			System.out.println("MATCH 0x000000 (match null :D)");
		}
	}
	
	public void initJoueur(int mycolour) {
		couleurJ = mycolour;
	}
	
	public void mouvementEnnemi(int startRow, int startCol, int finishRow, int finishCol) {
		plateau.jouerCoupSansHisto(new Coup(plateau.plateau[startCol][startRow].p, finishCol, finishRow, plateau, null));
	}
	
	public String quadriName() {
		return "les Semi-Croustillants";
	}
	
	private Coup executeIA() {
		Coup coup, meilleurCoup = null;
		int valeur = Heuristique.MIN_VAL, i = 1;
		
		peutContinuer = true;
		timerIA.restart();
		
		do {	// Implémentation de l'Itrerative Deepening
			coup = negAlphaBeta(Heuristique.MIN_VAL, Heuristique.MAX_VAL, i, couleurJ);
			
			if(coup.meilleur > valeur) {
				valeur = coup.meilleur;
				meilleurCoup = coup;
			}
			i++;
			
		} while(peutContinuer);
		
		plateau.carte.histo.clear();
		
		return coup;
	}
	
	private Coup negAlphaBeta(int alpha, int beta, int horizon, int couleur) {
		Coup meilleurCoup;
		int meilleur = Heuristique.MIN_VAL;
		
		ArrayList<Coup> listeCoups = plateau.listeCoupsDispos(couleur);

		meilleurCoup = listeCoups.get(0);
		
		for(int i = 0; i < listeCoups.size(); i++) {
			int val;
			
			plateau.jouerCoupAvecHisto(listeCoups.get(i));
			val = - negAlphaBetaRec(-beta, -alpha, horizon - 1, couleur%2 + 1);
			plateau.annulerCoup(listeCoups.get(i));
			
			if(val > meilleur) {
				meilleurCoup = listeCoups.get(i);
				meilleur = val;
			}
		}
		
		listeCoups.clear();
		meilleurCoup.meilleur = meilleur;
		
		return meilleurCoup;
	}
	
	private int negAlphaBetaRec(int alpha, int beta, int horizon, int couleur) {
		if(horizon == 0 || !peutContinuer)
			return Heuristique.evaluer(plateau, couleur);
		
		if(couleur == IJoueur.NOIR) {
			if(!plateau.pionsBlancs[4].estSurPlateau)
				return Heuristique.MAX_VAL;
			if(plateau.pionsBlancs[4].cas.type == Case.SORTIE)
				return Heuristique.MIN_VAL;
		}
		else {
			if(!plateau.pionsBlancs[4].estSurPlateau)
				return Heuristique.MIN_VAL;
			if(plateau.pionsBlancs[4].cas.type == Case.SORTIE)
				return Heuristique.MAX_VAL;
		}
		
		ArrayList<Coup> listeCoups = plateau.listeCoupsDispos(couleur);
		
		for(int i = 0; i < listeCoups.size(); i++) {
			int val;
			
			plateau.jouerCoupAvecHisto(listeCoups.get(i));
			val = - negAlphaBetaRec(-beta, -alpha, horizon - 1, couleur%2 + 1);
			plateau.annulerCoup(listeCoups.get(i));
			
			if(val > alpha) {
				alpha = val;
				
				if(alpha > beta)
					return alpha;
			}
		}
		
		listeCoups.clear();
		return alpha;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		peutContinuer = false;
	}
}
